package com.example.multinetty.netty.thirdprotocal;


import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.MessageToMessageDecoder;

import java.io.IOException;
import java.util.List;

/**
 * 数据包解码器
 * <pre>
 * 数据包格式
 * +——----——+——-----——+——----——+——----——+——-----——+
 * |  包头	|  模块号      |  命令号    |   长度     |   数据       |
 * +——----——+——-----——+——----——+——----——+——-----——+
 * </pre>
 * 包头4字节
 * 模块号2字节 
 * 命令号2字节
 * 长度4字节(数据部分占有字节数量)
 * 
 * @author -Sunjingke-
 * 采用了LengthFieldBasedFrameDecoder
 */
public class FullRequestParse extends MessageToMessageDecoder<ByteBuf> {
	@Override
	protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf frame, List<Object> list) throws Exception {


		Request message = new Request();
		int fixedHeader=frame.readInt();//这个头没有作用，被抛弃掉，不放入到request中
		message.setModule(frame.readShort());
		message.setCmd(frame.readShort());
		//读数据部分
		int dataLength=frame.readInt();
		byte[] data = new byte[dataLength];
		frame.readBytes(data);//这个读的含义是把frame中的内容，读入到data中。对应非byte[]类型的，采用实例化的方式就可以申请到内存。与这个本质上是一样的。
		//所以说，Netty是零Copy，是指Netty本身的底层框架，并不是指解码的部分。在解码的时候，还是需要在堆中创建对象，占用内存的。
		message.setData(data);
		//如果是Http的协议，如何确定它的长度？ httparrgator？
		//parseloginbody(frame);
		list.add(message);
	}
}
